import { ActionType, ColumnType } from "@/views/types"

export interface AppConfiguration extends MicroConfiguration {
  name?: string
  owner?: string
  version?: string
  logo?: string
  copyright?: string
  micros?: Record<string, MicroConfiguration>
  groups?: Record<string, GroupConfiguration> // 对【seed,action,home】进行分组的定义
  root?: string // 前端用到的app根组件名称
  rootLayout?: LayoutConfiguration
  rootProps?: Record<string, any> // app根组件对应的属性
  login?: string // 前端用到的login组件名称
  loginLayout?: LayoutConfiguration
  loginProps?: Record<string, any> // login组件对应的属性
  home?: string // 前端用到的home组件名称
  homeLayout?: LayoutConfiguration
  homeProps?: Record<string, any> // home组件对应的属性
  error?: string // 前端用到的error组件名称
  errorLayout?: LayoutConfiguration
  errorProps?: Record<string, any> // error组件对应的属性
  redirect?: string // 前端用到的redirect组件名称
  redirectLayout?: LayoutConfiguration
  redirectProps?: Record<string, any> // redirect组件对应的属性
}

export interface IconConfiguration {
  icon?: string // 入口图标名称
  color?: string // 入口图标颜色
  size?: number // 入口图标尺寸
  hoverColor?: string // 入口图标鼠标划过颜色
}

export interface MicroConfiguration extends IconConfiguration {
  label?: string
  comment?: string
  component?: string
  layout?: LayoutConfiguration
  componentProps?: Record<string, any>
  homes?: Record<string, HomeConfiguration>
  seeds?: Record<string, SeedConfiguration>
  actions?: Record<string, ActionConfiguration> // 独立行为
  libs?: string
}

export interface HomeConfiguration extends IconConfiguration {
  name?: string
  position?: ('nav'|'menu'|'ucenter')[]
  mode?: 'popup'|'content' // 界面显示模式： popup: 弹窗显示, content: 内容区显示
  label?: string
  comment?: string
  component?: string
  layout?: LayoutConfiguration
  componentProps?: Record<string, any>
  popupProps?: Record<string, any>
  affix?: boolean
  hidden?: boolean
  breadcrumb?: boolean
  noTagsView?: boolean
}

export interface LayoutConfiguration {
  type?: string
  component?: string
  componentProps?: Record<string, any>
  cls?: string[]
  style?: Record<string, any>
  content?: string
  children?: LayoutConfiguration[]
}

export interface SeedConfiguration extends HomeConfiguration {
  tableName?: string
  tableSchema?: string
  type?: 'module'|'through'
  // primaryKey?: string // 主键，多个用逗号分隔
  // idColumn?: string // 一般是主键
  nameColumn?: string // 一般是name字段

  columns?: Record<string, ColumnConfiguration> // 列定义， 键为列名, 下划线风格
  actions?: Record<string, ActionConfiguration> // 键为功能名称
  hasOne?: Record<string, HasOneConfiguration> // 主子： 一对一关系， 键为cross, 下划线风格
  hasMany?: Record<string, HasManyConfiguration> // 主子： 一对多关系， 键为cross, 下划线风格
  belongsTo?: Record<string, BelongsToConfiguration> // 子主： 一对一关系， 键为cross, 下划线风格
  habtm?: Record<string, HabtmConfiguration> // 平级： 多对多关系， 键为cross, 下划线风格

  onSave?: string // 保存时的事件监听
  onUpdate?: string // 更新时的事件监听
  onSet?: string // 查询时的事件监听

  declares?: string[] // 功能所需要的数据列
  searches?: string[] // 如果是功能是page或list，这里申明对应的搜索拦，形如：name_like,age_eq等
  orders?: string[] // 排序
  useKeyword?: boolean // 是否使用关键字
  stats?: Record<string, StatConfiguration> // 统计
  groups?: Record<string, GroupConfiguration> // 对【declare】进行分组的定义

  checkLogin?: boolean // 是否需要检查登录
  checkAction?: boolean // 是否需要检查功能权限
  checkData?: boolean // 是否需要检查数据权限
  checkField?: boolean // 是否需要检查字段权限
}

export interface ActionConfiguration extends HomeConfiguration {
  type?: ActionType // 行为类型
  // toolbar?: string // 工具条上的操作入口,逗号分隔
  // row?: string // 数据行上的操作入口,逗号分隔
  declare?: string // 设置值的列名, 当类型为set时，这里表示要设置的申明
  declareValue?: string // 要设置的申明的值
  elements?: Record<string, ElementConfiguration> // 这里定义的列可以覆盖通用列

  seedName?: string // 独立行为依赖的seed名称

  declares?: string[] // 行为所需要的数据列
  searches?: string[] // 如果是功能是page或list，这里申明对应的搜索拦，形如：name_like,age_eq等
  orders?: string[] // 排序
  stats?: Record<string, StatConfiguration> // 统计

  checkLogin?: boolean // 是否需要检查登录
  checkAction?: boolean // 是否需要检查功能权限
  checkData?: boolean // 是否需要检查数据权限
  checkField?: boolean // 是否需要检查字段权限
  useKeyword?: boolean
  // confirm?: string // 二次确认提示信息
}

export interface ElementConfiguration {
  element: string
  elementProps: Record<string, any>
}

export interface GroupConfiguration extends IconConfiguration {
  name?: string
  label?: string
  comment?: string
  /**
   * 用于【action,home,seed】和【declare】的分组
   * 1. 【action,home,seed】分组： items形如【app.micro.seed】组成的数组
   * 2. 【declare】分组：items为【declare】组成的数组
   */
  items?: string[]
}

export interface ColumnConfiguration {
  type?: ColumnType
  /**
   * 数据库中的字段长度，比如 varchar(32) 中的 32
   */
  length?: number
  label?: string
  comment?: string //字段注释
  defVal?: string //COLUMN_DEF 默认值

  precision?: number
  scale?: number
  required?: boolean
  unique?: boolean
  min?: any
  max?: any
  rel?: string
  options?: Record<string, string>

  element?: string
  elementProps?: Record<string, any>

  isLarge?: boolean
  onInsertValue?: string
  onUpdateValue?: string

  typeHandler?: string
}

export interface RelationConfiguration {
  seedName?: string
  selfColumn?: string
  targetColumn?: string
  label?: string
  comment?: string
  extra?: Record<string, any>
}

export interface BelongsToConfiguration extends RelationConfiguration {

}

export interface HasOneConfiguration extends BelongsToConfiguration {
  cascade?: 'none'|'setnull'|'force'|'check'
}

export interface HasManyConfiguration extends HasOneConfiguration {
  limit?: number
}

export interface HabtmConfiguration extends HasManyConfiguration {
  throughSeedName?: string
  throughSelfColumn?: string
  throughTargetColumn?: string
}

export interface StatConfiguration {
  name?: string
  label?: string
  comment?: string
  type?: 'count'|'sum'|'avg'|'min'|'max'
  declare?: string // 统计申明
  searches?: string[] // 统计条件
}

export type SplitterPanelProps = {
  size?: string | number,
  min?: string | number,
  max?: string | number,
  resizable?: boolean,
  collapsible?: boolean
}